package logrus

import (
	"fmt"
	rotatelogs "github.com/lestrrat-go/file-rotatelogs"
	"github.com/rifflock/lfshook"
	"github.com/sirupsen/logrus"
	"time"
)

type LogrusConfig struct {
	//文件名(包含路径)
	Filename  string
	Formatter logrus.Formatter
	Level     logrus.Level
	//显示文件名和行号
	ReportCaller bool
	//日志文件轮转时间(秒)
	RotationTime int64
	//日志文件存活时间,超期则删除
	FileMaxAge int64
}

func InitLogs(config *LogrusConfig) {
	// 设置日志格式为json格式
	//logrus.SetFormatter(&logrus.JSONFormatter{})
	//logrus.SetFormatter(&logrus.TextFormatter{})
	//自定义日志格式,框架只提供了TextFormatter和JSONFormatter
	logrus.SetFormatter(config.Formatter)

	// 设置日志级别为warn以上
	logrus.SetLevel(config.Level)

	//显示文件名和行号
	logrus.SetReportCaller(config.ReportCaller)

	// 设置将日志输出到标准输出（默认的输出为stderr，标准错误）
	// 日志消息输出可以是任意的io.writer类型
	//logrus.SetOutput(os.Stdout)

	path := config.Filename
	/* 日志轮转相关函数
	`WithLinkName` 为最新的日志建立软连接
	`WithRotationTime` 设置日志分割的时间，隔多久分割一次
	WithMaxAge 和 WithRotationCount二者只能设置一个
	 `WithMaxAge` 设置文件清理前的最长保存时间
	 `WithRotationCount` 设置文件清理前最多保存的个数
	*/
	// 下面配置日志每隔 1 分钟轮转一个新文件，保留最近 3 分钟的日志文件，多余的自动清理掉。
	writer, err := rotatelogs.New(
		path+".%Y%m%d%H%M",
		rotatelogs.WithLinkName(path),
		rotatelogs.WithMaxAge(time.Duration(config.FileMaxAge)*time.Second),
		rotatelogs.WithRotationTime(time.Duration(config.RotationTime)*time.Second),
	)
	if nil != err {
		fmt.Println(err)
	}

	//logrus.SetOutput(writer)

	//为所有的级别设置
	lfsHook := lfshook.NewHook(lfshook.WriterMap{
		logrus.DebugLevel: writer,
		logrus.InfoLevel:  writer,
		logrus.WarnLevel:  writer,
		logrus.ErrorLevel: writer,
		logrus.FatalLevel: writer,
		logrus.PanicLevel: writer,
	}, &logrus.TextFormatter{DisableColors: true})

	logrus.AddHook(lfsHook)

}


